package cn.demoncat.util.ocr.tess4j;

import cn.demoncat.util.exception.IoRuntimeException;
import cn.demoncat.util.io.CloseUtil;
import cn.demoncat.util.ocr.tess4j.config.Tess4jProperties;
import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract1;
import net.sourceforge.tess4j.TesseractException;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import javax.imageio.ImageIO;
import java.awt.*;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * 图片识别：Tess4J OCR
 * 
 * @author 延晓磊
 *
 * @since 2019年10月23日
 */
@Component
public class Tess4jUtil {

	@Resource
	private Tess4jProperties tess4jProperties;

	/**
	 * 图片识别
	 * 
	 * @param img		图片
	 * @return 读取结果文本
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年10月23日
	 */
	public String ocr(InputStream img) {
		return ocr(img, null);
	}

	/**
	 * 图片识别
	 * 
	 * @param img		图片
	 * @return 读取结果文本
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年10月23日
	 */
	public String ocr(byte[] img) {
		return ocr(img, null);
	}
	
	/**
	 * 图片识别
	 * 
	 * @param img		图片
	 * @param isChinese	中文true，英文false，混合null
	 * 
	 * @return 读取结果文本
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年10月23日
	 */
	public String ocr(InputStream img, Boolean isChinese) {
		return ocr(img, isChinese, null);
	}

	/**
	 * 图片识别
	 * 
	 * @param img		图片
	 * @param isChinese	中文true，英文false，混合null
	 * @return 读取结果文本
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年10月23日
	 */
	public String ocr(byte[] img, Boolean isChinese) {
		return ocr(img, isChinese, null);
	}
	
	/**
	 * 图片识别
	 * 
	 * @param img		图片
	 * @param isChinese	中文true，英文false，混合null
	 * @param rect		识别区
	 * 
	 * @return 读取结果文本
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年10月23日
	 */
	public String ocr(byte[] img, Boolean isChinese, Rectangle rect) {
		return ocr(new ByteArrayInputStream(img), isChinese, rect);
	}
	
	/**
	 * 图片识别
	 * 
	 * @param img		图片
	 * @param isChinese	中文true，英文false，混合null
	 * @param rect		识别区
	 * 
	 * @return 读取结果文本
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年10月23日
	 */
	public String ocr(InputStream img, Boolean isChinese, Rectangle rect) {
		ITesseract instance = new Tesseract1();
		// 语言库
		instance.setDatapath(tess4jProperties.getDir());
		// 语言
		instance.setLanguage(isChinese == null ? "eng+chi_sim" : isChinese ? "chi_sim" : "eng");
		// 识别
		try {
			if (rect == null) {
				return StringUtils.trimToEmpty(instance.doOCR(ImageIO.read(img)));
			}else {
				return StringUtils.trimToEmpty(instance.doOCR(ImageIO.read(img), rect));
			}
		} catch (TesseractException | IOException e) {
			throw new IoRuntimeException("识别图片失败", e);
		}finally {
			CloseUtil.close(img);
		}
	}
}
